package com.bird.singletonpattern;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @Author: sijunqiang
 * @Date: 2020/4/12 17:58
 * @Description: 定义枚举类单例模式 无视反射的实例 枚举了定义的单例模式 可以防止反射破环单例
 */
public class EnumStarvingSingleton  {
    /*空参构造*/
    private EnumStarvingSingleton() {}
    /**
     * <P>提供静态方法获取实例</P>
     *
     * @return
     */
    public static EnumStarvingSingleton getInstance() {
        EnumStarvingSingleton instance = ContainerHolder.HOLDER.instance;
        return instance;
    }
    /**
     * 私有的枚举类
     */
    private enum ContainerHolder {
        /**
         *
         */
       HOLDER;
        private EnumStarvingSingleton instance;
        /**
         * 私有枚举了的构造方法
         *  枚举类也是饿汉模式
         */
         ContainerHolder() {
            instance = new EnumStarvingSingleton();
        }
    }


    /**
     * <P>该方法是个测试方法：目的是不能通过反射的方式获取枚举的对象.
     * 所以这个方法是错误的
     * </P>
     * @param args
     */
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<ContainerHolder> aClass = ContainerHolder.class;
        Constructor<ContainerHolder> constructor = aClass.getDeclaredConstructor(String.class,int.class);
        constructor.setAccessible(true);
        System.out.println("constructor = " + constructor.newInstance());
    }



}
